#pragma once
#include <QString>
#include <QDebug>
#include <QIcon>
#include <QUuid>
#include <QDateTime>
#include <QFile>
#include <QFileInfo>

namespace model
{

// 定义宏日志
// #define TAG "[" << model::getFileName(__FILE__) << ":" << __LINE__ << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") << "]"
#define TAG QString("[%1:%2 %3]").arg(model::getFileName(__FILE__), QString::number(__LINE__), QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
#define DEBUG() qDebug().noquote().nospace() << TAG << "[DEBUG]: "
#define INFO() qDebug().noquote().nospace() << TAG << "[INFO]: "
#define ERROR() qDebug().noquote().nospace() << TAG << "[ERROR]: "
#define CRITICAL() qDebug().noquote().nospace() << TAG << "[CRITICAL]: "

// 生成唯一id
static inline QString makeId(const QString &prefix = "")
{
    return prefix + QUuid::createUuid().toString().sliced(25, 12);
}

// 获取秒级时间戳
static inline int64_t getTime()
{
    return QDateTime::currentSecsSinceEpoch();
}

// 通过时间戳转化为格式化时间
static inline QString formatTime(int64_t timestamp)
{
    QDateTime datetime = QDateTime::fromSecsSinceEpoch(timestamp);
    return datetime.toString("yyyy-MM-dd HH:mm:ss");
}

// 将QByteArray转化为QIcon
static inline QIcon makeIcon(const QByteArray &byteArray)
{
    QPixmap pixmap;
    if (!pixmap.loadFromData(byteArray))
    {
        qDebug() << "图像加载失败";
        return QIcon();
    }
    QIcon icon(pixmap);
    return icon;
}

static inline QString getFileName(const QString &path)
{
    QFileInfo fileInfo(path);
    return fileInfo.fileName();
}

// 读写文件操作
static inline QByteArray loadFileToByteArray(const QString &path)
{
    QFile readFile(path);
    if (!readFile.open(QFile::ReadOnly))
    {
        qDebug() << "文件打开失败: " << path;
    }
    QByteArray content = readFile.readAll();
    readFile.close();
    return content;
}

static inline void writeByteArrayToFile(const QString &path, const QByteArray &content)
{
    QFile writeFile(path);
    if (!writeFile.open(QFile::WriteOnly))
    {
        qDebug() << "文件打开失败: " << path;
    }
    writeFile.write(content);
    writeFile.flush();
    writeFile.close();
}
} // end model
